package com.twod.feralvillage;

public class MotionBlurComponent extends GameComponent {
        private static final int STEP_COUNT = 4;
        private static final float STEP_DELAY = 0.1f;
        private static final float OPACITY_STEP = 1.0f / (STEP_COUNT + 1);
        private BlurRecord[] mHistory;
        private RenderComponent mBlurTarget;
        private float mStepDelay;
        private int mCurrentStep;
        private float mTimeSinceLastStep;
        private int mTargetPriority;
       
        private class BlurRecord {
                public Vector2 position = new Vector2();
                public Texture texture;
                public int width;
                public int height;
                public int[] crop = new int[4];
        }
        public MotionBlurComponent() {
        super();
        mHistory = new BlurRecord[STEP_COUNT];
        for (int x = 0; x < STEP_COUNT; x++) {
                mHistory[x] = new BlurRecord();
        }
        reset();
        setPhase(ComponentPhases.PRE_DRAW.ordinal());
    }
       
        @Override
        public void reset() {
                for (int x = 0; x < STEP_COUNT; x++) {
                        mHistory[x].texture = null;
                        mHistory[x].position.zero();
        }
                mStepDelay = STEP_DELAY;
                mBlurTarget = null;
                mCurrentStep = 0;
                mTimeSinceLastStep = 0.0f;
        }
       
        public void setTarget(RenderComponent target) {
                mBlurTarget = target;
        }
       
        @Override
        public void update(float timeDelta, BaseObject parent) {
                if (mBlurTarget != null) {
                        mTimeSinceLastStep += timeDelta;
                        if (mTimeSinceLastStep > mStepDelay) {
                                DrawableBitmap drawable = (DrawableBitmap)mBlurTarget.getDrawable();
                                if (drawable != null) {
                                        Texture currentTexture = drawable.getTexture();
                                        mTargetPriority = mBlurTarget.getPriority();
                                        mHistory[mCurrentStep].texture = currentTexture;
                                        mHistory[mCurrentStep].position.set(((GameObject)parent).getPosition());
                                        mHistory[mCurrentStep].width = drawable.getWidth();
                                        mHistory[mCurrentStep].height = drawable.getHeight();
                                        final int[] drawableCrop = drawable.getCrop();
                                        mHistory[mCurrentStep].crop[0] = drawableCrop[0];
                                        mHistory[mCurrentStep].crop[1] = drawableCrop[1];
                                        mHistory[mCurrentStep].crop[2] = drawableCrop[2];
                                        mHistory[mCurrentStep].crop[3] = drawableCrop[3];
                                        mCurrentStep = (mCurrentStep + 1) % STEP_COUNT;
                                        mTimeSinceLastStep = 0.0f;
                                }
                        }
                       

            RenderSystem renderer = sSystemRegistry.renderSystem;
           
           
                        final int startStep = mCurrentStep > 0 ? mCurrentStep - 1 : STEP_COUNT - 1;
                        // draw each step
                        for (int x = 0; x < STEP_COUNT; x++) {
                                final int step = (startStep - x) < 0 ? (STEP_COUNT + (startStep - x)) : (startStep - x);
                                final BlurRecord record = mHistory[step];
                                if (record.texture != null) {
                                        DrawableBitmap stepImage = sSystemRegistry.drawableFactory.allocateDrawableBitmap();
                                        stepImage.setTexture(record.texture);
                                        stepImage.setWidth(record.width);
                                        stepImage.setHeight(record.height);
                                        stepImage.setCrop(record.crop[0], record.crop[1], record.crop[2], -record.crop[3]);
                                        final float opacity = (STEP_COUNT - x) * OPACITY_STEP;
                                        stepImage.setOpacity(opacity);
                                       
                     
                    renderer.scheduleForDraw(stepImage, record.position, mTargetPriority - (x + 1), true);
                                }
                        }
                }
        }
}

